﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using LinqToDataSets.dsExemposTableAdapters;

namespace LinqToDataSets
{
    class Program
    {
        static void Main(string[] args)
        {

            dsExempos exemplos = new dsExempos();

            new Exemplo1TableAdapter().Fill(exemplos.Exemplo1);
            new ValorTableAdapter().Fill(exemplos.Valor);

            IEnumerable<dsExempos.Exemplo1Row> resultados;


            WriteExampleHeading("Exemplo - Devolver todos os dados");
            resultados =
                    from exemplo in exemplos.Exemplo1
                    select exemplo;
            WriteResult<dsExempos.Exemplo1Row>(resultados);






            //WriteExampleHeading("Exemplo - Where simples");
            //resultados =
            //        from exemplo in exemplos.Exemplo1
            //        where exemplo.Designacao1.Contains("1")
            //        select exemplo;
            //WriteResult<dsExempos.Exemplo1Row>(resultados);





            //WriteExampleHeading("Exemplo - Ordenacao simples");
            //resultados =
            //        from exemplo in exemplos.Exemplo1
            //        orderby exemplo.Valor1
            //        //orderby exemplo.Valor1 descending
            //        select exemplo;
            //WriteResult<dsExempos.Exemplo1Row>(resultados);





            //WriteExampleHeading("Exemplo - Group By");
            //IEnumerable<IGrouping<decimal, dsExempos.Exemplo1Row>> grupos =
            //        from exemplo in exemplos.Exemplo1
            //        group exemplo by exemplo.Valor1 into gr
            //        select gr;

            //WriteResult<IGrouping<decimal, dsExempos.Exemplo1Row>>(grupos);




            //WriteExampleHeading("Exemplo - Join");
            //var resultadosJoin =
            //        from exemplo in exemplos.Exemplo1
            //        join valor in exemplos.Valor on exemplo.Valor1 equals valor.Chave1
            //        select new
            //        {
            //            ChaveExemplo = exemplo.Chave1,
            //            DesignacaoExemplo = exemplo.Designacao1,
            //            DesignacaoValor = valor.Designacao1
            //        };
            //foreach (var resultadoJoin in resultadosJoin)
            //{
            //    Console.WriteLine("ChaveExemplo = " + resultadoJoin.ChaveExemplo
            //                        + ", DesignacaoExemplo = " + resultadoJoin.DesignacaoExemplo
            //                        + ", DesignacaoValor = " + resultadoJoin.DesignacaoValor);
            //}




            //WriteExampleHeading("Exemplo - Left Join");
            //var resultadosLeftJoin =
            //        from exemplo in exemplos.Exemplo1
            //        join valor in exemplos.Valor on exemplo.Valor1 equals valor.Chave1 into ps
            //        from valor in ps.DefaultIfEmpty()
            //        select new
            //        {
            //            ChaveExemplo = exemplo.Chave1,
            //            DesignacaoExemplo = exemplo.Designacao1,
            //            DesignacaoValor = valor == null ? "Sem Designacao" : valor.Designacao1
            //        };
            //foreach (var resultadoJoin in resultadosLeftJoin)
            //{
            //    Console.WriteLine("ChaveExemplo = " + resultadoJoin.ChaveExemplo
            //                        + ", DesignacaoExemplo = " + resultadoJoin.DesignacaoExemplo
            //                        + ", DesignacaoValor = " + resultadoJoin.DesignacaoValor);
            //}





            //WriteExampleHeading("Exemplo - Alteração e Obtenção de Dados");
           
            //exemplos.Exemplo1[0].SetField<int?>("Valor1", null);

            //int? valor1 = exemplos.Exemplo1[0].Field<int?>("Valor1");

            //Console.WriteLine("Valor 1 : " + valor1.ToString());
            
            
            Console.ReadLine();
        }

        #region Helper Methods

        private static void WriteExampleHeading(string descricaoExemplo)
        {
            if (first)
                first = false;
            else
                Console.WriteLine(Environment.NewLine);
            Console.WriteLine(descricaoExemplo + Environment.NewLine);
        }
        private static void WriteResult<T>(IEnumerable<T> resultados)
        {
            foreach (T resultado in resultados)
            {
                WriteObject(resultado);
            }
        }
        private static void WriteObject(object objectToWrite)
        {
            dsExempos.Exemplo1Row obj = objectToWrite as dsExempos.Exemplo1Row;
            if (obj != null)
            {
                Console.WriteLine("Chave1 = " + obj.Chave1 + ", Designacao1 = " + obj.Designacao1 + ", Valor1 = " + obj.Valor1);
                return;
            }

            IGrouping<decimal, dsExempos.Exemplo1Row> objg = objectToWrite as IGrouping<decimal, dsExempos.Exemplo1Row>;
            if (objg != null)
            {
                Console.WriteLine("Indice de grupo = " + objg.Key);
                foreach (dsExempos.Exemplo1Row obj2 in objg)
                {
                    Console.WriteLine("   - Chave1 = " + obj2.Chave1 + ", Designacao1 = " + obj2.Designacao1 + ", Valor1 = " + obj2.Valor1);
                }
                return;
            }

            Console.WriteLine(objectToWrite.ToString());
        }

        static bool first = true;

        #endregion
 
    }
}
